﻿using AutoMapper;
using ExcellentProjectPlus.Aplicacion.Calificaciones.Cursos;
using ExcellentProjectPlus.Dominio.Calificaciones.Entidades;
using Servicios.Calificaciones.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Description;

namespace Servicios.Calificaciones.Controllers
{
    public class CursosController : ApiController
    {
        #region Propiedades
        IServicioDeGestionDeCursos _servicioDeGestionDeCursos;
        #endregion

        #region Constructores
        public CursosController(IServicioDeGestionDeCursos servicioDeGestionDeCursos)
        {
            _servicioDeGestionDeCursos = servicioDeGestionDeCursos;
            Mapper.CreateMap<Curso, CursoModel>()
                .ForMember(x => x.Periodo, x => x.MapFrom(y => y.Periodo.Nombre));
        }
        #endregion


        [HttpGet]
        [Route("api/cursos")]
        [ResponseType(typeof(IEnumerable<InformacionCurso>))]
        public IHttpActionResult Get()
        {
            return Ok(_servicioDeGestionDeCursos.ObtenerInformacionCursos());
        }
        [HttpGet]
        [ResponseType(typeof(Curso))]
        [Route("api/cursos/{id}")]
        public IHttpActionResult GetCurso(int id)
        {
            Curso curso = _servicioDeGestionDeCursos.ObtenerCursoPorId(id);
            if(curso == null)
            {
                return NotFound();
            }
            return Ok(curso);
        }

        [HttpPost]
        [Route("api/cursos")]
        public IHttpActionResult Post(Curso curso)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            _servicioDeGestionDeCursos.AgregarCurso(curso);

            return Ok();
        }

        [HttpPut]
        [Route("api/cursos/{id}")]

        public IHttpActionResult Put(int id, Curso curso)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != curso.Id)
            {
                return BadRequest();
            }

            _servicioDeGestionDeCursos.ModificarCurso(curso);

            return StatusCode(HttpStatusCode.NoContent);
        }

        [ResponseType(typeof(Curso))]
        [HttpDelete()]
        [Route("api/cursos/{id}")]
        public IHttpActionResult Delete(int id)
        {
            Curso curso = _servicioDeGestionDeCursos.ObtenerCursoPorId(id);
            if (curso == null)
            {
                return NotFound();
            }

            _servicioDeGestionDeCursos.EliminarCurso(curso);

            return Ok(curso);
        }
        private bool CursoExists(int id)
        {
            return _servicioDeGestionDeCursos.ObtenerCursoPorId(id) != null;
        }

        [HttpGet()]
        [Route("api/cursos/GetPagedCursos/{pageIndex}/{pageSize}")]
        public IEnumerable<Curso> GetPagedCursos(int pageIndex, int pageSize)
        {
            return _servicioDeGestionDeCursos.ObtenerCursosPaginado(pageIndex, pageSize);
        }

        [HttpGet()]
        [Route("api/cursos/obtenerCursosDocente/{idDocente}")]
        [ResponseType(typeof(List<Curso>))]
        public IHttpActionResult ObtenerCursosDocente(int idDocente)
        {
            List<Curso> cursos = _servicioDeGestionDeCursos.ObtenerCursosPorDocente(idDocente);
            if (cursos == null)
            {
                return NotFound();
            }
            return Ok(Mapper.Map<List<Curso>, List<CursoModel>>(cursos));
        }
    }
}
